typedef struct promocao {
	int chave;
	int RRN;
	int filho_esq;
	int filho_dir;
} promocao;

typedef struct pilha *ApPilha;

typedef struct pilha
{
	int pagina;
	int pagina_eh_raiz;
	int nivel;
	int num_chaves;
	ApPilha prox;
} pilha;

typedef pilha fila;

typedef ApPilha ApFila;

typedef struct Registro
{
	char RA[7];
	char NOME[24];
	char CIDADE[15];
	char TEL[9];
	char ALT[9];
	char SEX[2];
	char CURSO[3];
} Registro;

void carregaConfiguracoes (char **mensagens);
/*Carrega o arquivo de configuracoes*/

int verificaParametros(char *mensagens[], int ordem, char *dados[]);
/*Verifica a validade dos parametros passados na linha de comando,
 * passiveis de erros*/

void cardapio (char *mensagens[], int ordem, char dados[], char indice[], char desprezadas[], char descricao[]);
/*Apresenta as opções ao usuario*/

void constroiArvore(char *mensagens[], int ordem, char *dados[], char *indice[], char *desprezadas[]);
/*Constroi a arvore B*/

int geraArquivoEstrutura(char *indice, int ordem, char *descricao);
/*Gera arquivo com a estrutura da árvore B*/

int pesquisaBaseDados(char **mensagens, char *dados, char *indice, int ordem);
/*Faz pesquisa na base de dados*/

void LiberaPilhaouFila(ApPilha Estrutura);
/*Libera memoria utilizada pela Estrutura usada como pilha ou fila*/

void extraiChaves(char *dados[]);
/*Extrai chaves primarias de um arquivo com registros de tamanho fixo*/

void desprezaRegistro(FILE *Dados, int RRN_atual, FILE *Desprezadas);
/*Escreve em um arquivo os registros repetidos*/

void criaPagina(FILE *ArvB, int num_paginas, int ordem, int folha, int n_keys);
/*Aloca espaco em disco para criacao de um novo nó da Arvore B*/

void ajustaOverflow(FILE *ArvB, int *num_paginas, int *pagina_raiz, int ordem, int *vetor_chaves, int *vetor_RRN, int *vetor_filhos, ApPilha Pilha, int tam_bytes_pagina);
/*Ajusta os nós da Arvore B para resolver um overflow, mantendo as propriedades da árvore*/

